/**
 * 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列：

// 序列中第一个单词是 beginWord 。
// 序列中最后一个单词是 endWord 。
// 每次转换只能改变一个字母。
// 转换过程中的中间单词必须是字典 wordList 中的单词。
// 给你两个单词 beginWord 和 endWord 和一个字典 wordList ，
// *找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列，返回 0。

 *
 * @export
 * @param {string} start
 * @param {string[]} wordList
 * @param {string} end
 */
export function ladderLength(start: string,  end: string, wordList: string[]) {
    const scanedMap: {
        [key: string]: boolean;
    } = {};
    function findClosed(startStr: string, wordListStr: string[]) {
        const resultArr: string[] = [];
        const compareOrigin: string[] = startStr.split('');
        scanedMap[startStr] = true;
        wordListStr.forEach(str => {
            if (scanedMap[str]) {
                return;
            }
            const compareTarget: string[] = str.split('');
            const resultLen = compareTarget.filter((s, index) => {
                return s !== compareOrigin[index];
            }).length;
            if (resultLen === 1) {
                scanedMap[str] = true;
                resultArr.push(str);
            }
        });
        return resultArr;
    }
    function findInstance(startArr: string[], wordList: string[], end: string, stepCount: number): any  {
        console.log(startArr, 'startArr')
        stepCount++;
        const cARR: string[][] = [];
        for (let i=0; i < startArr.length; i++) {
            const start = startArr[i];
            const closedArr = findClosed(start, wordList);
            console.log(start, closedArr)
            if (closedArr.indexOf(end) >= 0) {
                return stepCount;
            }
            cARR.push(closedArr);
        }
        return cARR.map(closedArr => {
            const result = findInstance(closedArr, wordList, end, stepCount);
            console.log(result, 'result')
            return result;
        }).reduce((pre, curr) => {
            pre = pre || 0;
            curr = curr || 0;
            return pre < curr && pre !== 0 || pre > curr && curr === 0 ? pre : curr;
        }, 0)
    }

    return findInstance([start], wordList, end, 1) || 0;
}
